package com.atguigu.tingshu.user.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.kafka.KafkaMessagePojo;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;

@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class UserListenProcessServiceImpl implements UserListenProcessService {

	@Autowired
	private MongoTemplate mongoTemplate;

  @Autowired
  private KafkaTemplate kafkaTemplate;
  /**
   * 保存用户的声音播放进度
   * @param userListenProcessVo
   * @return
   */
  @Override
  public void updateListenProcess(UserListenProcessVo userListenProcessVo) {
    // 获取当前登录用户的id
    Long userId = AuthContextHolder.getUserId();
    // 定义集合的名称
    String collectName = "user_listen_process_" + userId;
    // 查询用户的上一次的播放记录
    UserListenProcess userListenProcess
            = mongoTemplate.findOne(
                    Query.query(
                            Criteria
                              .where("userId").is(userId)
                              .and("albumId").is(userListenProcessVo.getAlbumId())
                              .and("trackId").is(userListenProcessVo.getTrackId())
                              .and("isShow").is(0)), UserListenProcess.class, collectName);
    // 判断是否为第一次播放
    if (userListenProcess == null){
      // 创建一个新的对象
        userListenProcess = new UserListenProcess();
        // 属性赋值
        userListenProcess.setId(IdWorker.get32UUID());
        userListenProcess.setUserId(userId);
        userListenProcess.setAlbumId(userListenProcessVo.getAlbumId()); // userListenProcessVo注意不要写成userListenProcess
        userListenProcess.setTrackId(userListenProcessVo.getTrackId());
        userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
        userListenProcess.setIsShow(0);
        userListenProcess.setCreateTime(new Date());
        userListenProcess.setUpdateTime(new Date());
    } else {
      // 不是第一次播放 更新播放的进度
      userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
      userListenProcess.setUpdateTime(new Date());
    }
    //发送行为消息
    KafkaMessagePojo kafkaMessagePojo = new KafkaMessagePojo();
    kafkaMessagePojo.setAlbumId(userListenProcessVo.getAlbumId());
    kafkaMessagePojo.setType("play");
    kafkaTemplate.send("tingshu_stream_rank_topic", JSONObject.toJSONString(kafkaMessagePojo));
    // 保存数据
    mongoTemplate.save(userListenProcess, collectName);
  }

  /**
   * 查询当前用户的声音播放进度
   * @param trackId
   * @return
   */
  @Override
  public Object getTrackBreakSecond(Long trackId) {
    // 获取当前登录用户的id
    Long userId = AuthContextHolder.getUserId();
    // 定义集合的名称
    String collectName = "user_listen_process_" + userId;
    // 查询用户的上一次的播放记录
    UserListenProcess userListenProcess
            = mongoTemplate.findOne(
            Query.query(
                    Criteria
                            .where("userId").is(userId)
                            .and("trackId").is(trackId)
                            .and("isShow").is(0)), UserListenProcess.class, collectName);
    return userListenProcess == null?new BigDecimal(0):userListenProcess.getBreakSecond();
  }
}
